import XLSX from 'xlsx';

/**
 * 导出excel方法
 * @param headers 表格头部数组
 * @param data 表格dataSource
 * @param fileName 导出表格的名称
 */
const widthMap = [{ wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 100 }, { wpx: 150 }, { wpx: 100 }, { wpx: 300 }, { wpx: 300 }];

/**
 *
 * @param headers
 *导出excel
 * @param data
 * @param fileName
 * @param width
 */
export function exportExcel(headers: any[], data: any[], fileName = '益丰记录表.xlsx', width: any[] = widthMap) {
  const _headers = headers
    .map((item, i) =>
      Object.assign(
        {},
        {
          key: item.key,
          title: item.title,
          position: String.fromCharCode(65 + i) + 1,
        },
      ),
    )
    .reduce(
      (prev, next) =>
        Object.assign({}, prev, {
          [next.position]: { key: next.key, v: next.title },
        }),
      {},
    );

  const _data = data
    .map((item, i) =>
      headers.map((key, j) =>
        Object.assign(
          {},
          {
            content: item[key.key],
            position: String.fromCharCode(65 + j) + (i + 2),
          },
        ),
      ),
    )
    // 对刚才的结果进行降维处理（二维数组变成一维数组）
    .reduce((prev, next) => prev.concat(next))
    // 转换成 worksheet 需要的结构
    .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.content } }), {});

  // 合并 headers 和 data
  const output = Object.assign({}, _headers, _data);
  // 获取所有单元格的位置
  const outputPos = Object.keys(output);
  // 计算出范围 ,["A1",..., "H2"]
  const ref = `${outputPos[0]}:${outputPos[outputPos.length - 1]}`;

  // 构建 workbook 对象
  const wb = {
    SheetNames: ['mySheet'],
    Sheets: {
      mySheet: Object.assign({}, output, {
        '!ref': ref,
        '!cols': width,
      }),
    },
  };

  // 导出 Excel
  XLSX.writeFile(wb, fileName);
}

/**
 * @description 第一行不为表头的excel转化为标准的excel数据
 * @author yangwen
 * @param {any[]} data
 * @return {*}
 */
export const convertExcelData = (data: any[]) => {
  if (data.length === 0) {
    return [];
  }

  const newData: any[] = [];
  let oldHeaders: (string | number)[] = []; // 旧的表头——长度一致
  let newHeaders: (string | number)[] = []; // 新的表头——长度一致
  data.forEach((item, index) => {
    const valueArr: (string | number)[] = Object.values(item);
    if (index === 0) {
      oldHeaders = Object.keys(item);
      // 第一行的值即为表头数据
      newHeaders = valueArr;
    } else {
      const newItem = {};
      oldHeaders.forEach((oldHeaderItem, oldHeaderIndex) => {
        newItem[newHeaders[oldHeaderIndex]] = item[oldHeaderItem];
      });
      newData.push(newItem);
    }
  });

  return newData;
};
